---
title: 越来越多的web服务开始采用RESTful风格设计和实现.html
categories: 我是一枚程序员
abbrlink: 42010
date: 2017-11-15 15:32:50
---
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>越来越多的web服务开始采用RESTful风格设计和实现</title>
    <style type="text/css" media="all">
      body {
        margin: 0;
        font-family: "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", sans-serif;
        font-size: 14px;
        line-height: 20px;
        color: #777;
        background-color: white;
      }
      .container {
        width: 700px;
        margin-right: auto;
        margin-left: auto;
      }

      .post {
        font-family: Georgia, "Times New Roman", Times, "SimSun", serif;
        position: relative;
        padding: 70px;
        bottom: 0;
        overflow-y: auto;
        font-size: 16px;
        font-weight: normal;
        line-height: 25px;
        color: #515151;
      }

      .post h1{
        font-size: 50px;
        font-weight: 500;
        line-height: 60px;
        margin-bottom: 40px;
        color: inherit;
      }

      .post p {
        margin: 0 0 35px 0;
      }

      .post img {
        border: 1px solid #D9D9D9;
      }

      .post a {
        color: #28A1C5;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="post">
        <h1 class="title">越来越多的web服务开始采用RESTful风格设计和实现</h1>
        <div class="show-content">
          <h3>文章概要：</h3><h4>什么是RESTful？</h4><h4>RESTful的规范是什么？</h4><h4>实际开发中RESTful是怎么使用的？</h4><hr><p>RESTful架构，是目前最流行的一种互联网软件架构，因为其结构清晰，符合标准，易于理解，扩展方便，所以越来越多的网站采用RESTful架构设计了。</p><div class="image-package">
<img src="http://upload-images.jianshu.io/upload_images/2833665-f19c2b8d8e7b1cef.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" data-original-src="http://upload-images.jianshu.io/upload_images/2833665-f19c2b8d8e7b1cef.png?imageMogr2/auto-orient/strip" data-image-slug="f19c2b8d8e7b1cef" data-width="253" data-height="199"><br><div class="image-caption"></div>
</div><p>其实，RESTful是一种开发理念，是对http很好的诠释。维基百科说：REST是设计风格而不是标准。REST通常基于使用HTTP，URI，和XML以及HTML这些现有的广泛流行的协议和标准。维基百科称其为“具象状态传输”（英文：Representational State Transfer，简称REST），我理解为“表现层状态转化”，是Roy Thomas Fielding博士于2000年在他的博士论文 "Architectural Styles and the Design of Network-based Software Architectures" 中提出来的一种万维网软件架构风格。</p><p>我们先来具体看下RESTful风格的url,比如我要查询商品信息，</p><blockquote>
<p>那么非REST的url：http://.../queryGoods?id=1001&amp;type=t01</p>
<p>REST的url: http://.../goods/1001</p>
</blockquote><p>可以看出REST特点：url简洁，将参数通过url传到服务器，而传统的url比较啰嗦，而且现实中浏览器地址栏会拼接一大串字符，相必你们都见过吧。但是采用REST的风格就会好很多，现在很多的网站已经采用这种风格了，这也是潮流方向，典型的就是url的短化转换。</p><p><b>我认为理解RESTful的核心就是理解Representational State Transfer这三个单词的意思。</b></p><p>具象的，就是指表现层，也就是“<b>资源</b>”，什么是资源呢？网站就是资源共享的东西，客户端（浏览器）访问web服务器，所获取的就叫资源。比如html，txt，json，图片，视频等等。浏览器通过URI确定一个资源，但是如何确定它的具体表现形式呢？应该在HTTP请求的头信息中用Accept和Content-Type字段指定，这两个字段才是对"表现层"的描述。</p><p><b>状态转换</b>，就是客户端和服务器互动的一个工程，在这个过程中产生了数据的状态的变化叫做状态转换。客户端访问必然使用HTTP协议<b>，HTTP协议实际上含有4个表示操作方式的动词，分别是 GET,POST,PUT,DELETE,他们分别对应四种操作。GET用于获取资源，POST用于新建或者更新资源，PUT用于更新资源，DElETE用于删除资源。</b>GET和POST是表单提交的两种基本方式，比较常见，而PUT和DElETE不太常用。而且HTTP协议是一种无状态协议，这样就必须把所有的状态都保存在服务器端。因此，如果客户端想要操作服务器，必须通过某种手段，让服务器端发生"状态转化"（State Transfer）</p><p>综合上面的解释，RESTful架构就是：</p><h2>每一个URI代表一种资源；</h2><h2>客户端和服务器之间，传递这种资源的某种表现层；</h2><h2>客户端通过四个HTTP动词，对服务器端资源进行操作，实现"表现层状态转化"。</h2><p>需要注意的是，<i><b>REST是设计风格而不是标准</b></i>。REST通常基于使用HTTP，URI，和XML以及HTML这些现有的广泛流行的协议和标准，汲取了WWW的成功经验：无状态，以资源为中心，充分利用HTTP协议和URI协议，提供统一的接口定义，使得它作为一种设计Web服务的方法而变得流行。</p><p>在某种意义上，通过强调URI和HTTP等早期Internet标准，REST是对大型应用程序服务器时代之前的Web方式的回归。目前Go对于REST的支持还是很简单的，通过实现自定义的路由规则，我们就可以为不同的method实现不同的handle，这样就实现了REST的架构。</p><p>上边说的是标准，但是实际开发中并没有全部实现标准，因为那样会增加开发成本。增加代码复杂度。我们就ssm框架例举一下restful风格的开发方法。</p><p>需求：RESTful方式实现商品信息查询，返回json数据</p><p>1.添加DispatcherServlet的rest配置</p><div class="image-package">
<img src="http://upload-images.jianshu.io/upload_images/2833665-9b8ebd5d60fa890a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" data-original-src="http://upload-images.jianshu.io/upload_images/2833665-9b8ebd5d60fa890a.jpg?imageMogr2/auto-orient/strip" data-image-slug="9b8ebd5d60fa890a" data-width="659" data-height="369"><br><div class="image-caption"></div>
</div><p>2.URL 模板模式映射<br></p><blockquote>
<p>@RequestMapping("/Items/{id}")</p>
<p>public @ResponseBody Items(@PathVariable("id") String id,Model model) throws Exception{</p>
<p>//方法中使用@PathVariable获取id的值，使用model传回页面</p>
<p>//调用 service查询商品信息</p>
<p>ItemsCustom items = itemsService.findItemsById(id);return items;</p>
<p>}<br></p>
</blockquote><p>解释：<b><i>@RequestMapping</i></b>(value="/ Items/{id}")：{×××}占位符，请求的URL可以是“/Items/1”或“/Items/2”，</p><p>通过在方法中使用<b><i>@PathVariable</i></b>获取{×××}中的×××变量。</p><p>@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。</p><p>如果RequestMapping中表示为"/Items/{id}"，id和形参名称一致，@PathVariable不用指定名称。简单讲就是使用了两个注解@ResponseBody和@PathVariable，@ResponseBody指返回的数据，@PathVariable指传入的参数。@PathVariable将@RequestMapping("/Items/{id}")的占位符id的数据取出，放到形参中，处理完数据用@ResponseBody返回。其中spring框架都给我们定义好了，我们只需要明确指定传入参数是什么，返回值在这里我使用的是json，而指定方式就是两个注解。是不是很方便？这就大大简化了开发，提高了效率。<br></p><p>本文章我首发在今日头条</p><p><br></p><p>相关链接：<a href="http://toutiao.com/i6321604815436644866/" target="_blank">Java开发的所有工具都在这里，全是最新版</a></p><p><a href="http://toutiao.com/i6315698413115539969/" target="_blank">开发时，要选择Spring mvc ，还是选择Struts2</a><br></p><p>作者：<a href="http://www.toutiao.com/m6741594486/" target="_blank">头条号 / 两毛五哥哥</a></p><p><a href="http://toutiao.com/i6319842786224914945/" target="_blank">链接：http://toutiao.com/i6319842786224914945/</a></p><p>来源：<a href="http://www.toutiao.com/" target="_blank">头条号（今日头条旗下创作平台）</a></p><p>著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</p>
        </div>
      </div>
    </div>
  </body>
</html>
